/*
 * @Author: your name
 * @Date: 2020-05-12 11:31:19
 * @LastEditTime: 2020-11-04 10:20:16
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: /vue-cli4-multi/vue.config.js
 */
const path = require('path')
const resolve = dir => path.join(__dirname, dir)
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV)
const webpack = require('webpack')

const glob = require('glob')
const pagesInfo = require('./pages.config')
const pages = {}
glob.sync('./src/modules/**/main.js').forEach(entry => {
  const chunk = entry.match(/\.\/src\/modules\/(.*)\/main\.js/)[1]
  const curr = pagesInfo[chunk]
  if (curr) {
    pages[chunk] = {
      entry,
      ...curr,
      chunk: ['chunk-vendors', 'chunk-common', chunk]
    }
  }
})

module.exports = {
  publicPath: './', // 默认'/'，部署应用包时的基本 URL
  outputDir: process.env.outputDir || 'dist', // 'dist', 生产环境构建文件的目录
  assetsDir: './static', // 相对于outputDir的静态资源(js、css、img、fonts)目录
  lintOnSave: process.env.NODE_ENV === 'development',
  runtimeCompiler: true, // 是否使用包含运行时编译器的 Vue 构建版本
  // 生成的 HTML 中的 <link rel="stylesheet"> 和 <script> 标签上启用 Subresource Integrity (SRI)
  integrity: false,
  productionSourceMap: !IS_PROD, // 生产环境的 source map
  parallel: require('os').cpus().length > 1,
  pwa: {},
  chainWebpack: config => {
    // 修复 HMR(热更新)失效
    config.resolve.symlinks(true)
    // 添加别名
    config.resolve.alias
      .set('@', resolve('src'))
      .set('@assets', resolve('src/assets'))
      .set('@components', resolve('src/components'))
      .set('@common', resolve('src/common'))
      .set('@front', resolve('src/modules/front'))
    // 防止多页面打包卡顿
    // eslint-disable-next-line no-unused-expressions
    config => config.plugins.delete('named-chunks')

    const cdn = {
      // 访问https://unpkg.com/element-ui/lib/theme-chalk/index.css获取最新版本
      css: ['//unpkg.com/element-ui@2.13.1/lib/theme-chalk/index.css'],
      js: [
        '//unpkg.com/vue@2.6.10/dist/vue.min.js', // 访问https://unpkg.com/vue/dist/vue.min.js获取最新版本
        '//unpkg.com/vue-router@3.0.6/dist/vue-router.min.js',
        '//unpkg.com/vuex@3.1.1/dist/vuex.min.js',
        '//unpkg.com/axios@0.19.0/dist/axios.min.js',
        '//unpkg.com/element-ui@2.13.1/lib/index.js',
        '//cdn.bootcss.com/echarts/4.8.0/echarts.min.js'
      ]
    }
    // 多页面cdn添加
    Object.keys(pagesInfo).forEach(page => {
      config.plugin(`html-${page}`).tap(args => {
        // html中添加cdn
        args[0].cdn = cdn
        // 修复 Lazy loading routes Error
        args[0].chunksSortMode = 'none'
        return args
      })
    })

    config.module.rule('svg').exclude.add(resolve('src/assets/icons')).end()
    config.module.rule('icons').test(/\.svg$/)
      .include.add(resolve('src/assets/icons')).end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      }).end()
    // 删除 moment 除 zh-cn 中文包外的其它语言包，无需在代码中手动引入 zh-cn 语言包
    config.plugin('ignore').use(
      new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /zh-cn$/)
    )
    return config
  },
  pages,
  configureWebpack: config => {
    config.externals = {
      vue: 'Vue',
      'element-ui': 'ELEMENT',
      'vue-router': 'VueRouter',
      vuex: 'Vuex',
      axios: 'axios',
      echarts: 'echarts',
      BMap: 'BMap',
      BMap_Symbol_SHAPE_POINT: 'BMap_Symbol_SHAPE_POINT'
      // i18n: 'VueI18n',
    }
  },
  devServer: {
    overlay: { // 让浏览器 overlay 同时显示警告和错误
      warnings: true,
      errors: true
    },
    open: false, // 是否打开浏览器
    host: '0.0.0.0',
    port: '8080', // 代理端口
    https: false,
    hotOnly: false, // 热更新
    proxy: {
      '/bound': {
        target: 'https://geo.datav.aliyun.com', // 目标代理接口地址
        // secure: false,
        changeOrigin: true, // 开启代理，在本地创建一个虚拟服务端
        // ws: true, // 是否启用websockets
        pathRewrite: {
          // '^/api': ''
        }
      }
    }
  }
}
